JavaScript Temporal API'ning Duration obyektini aniq va intuitiv vaqt intervallarini hisoblash uchun o'rganing, unda asosiy qo'llanishdan tortib murakkab holatlargacha barchasi qamrab olingan.
JavaScript Temporal Duration'ni o'zlashtirish: Vaqt intervallarini hisoblash bo'yicha to'liq qo'llanma
JavaScript Temporal API sanalar va vaqtlar bilan ishlashda sezilarli yutuqni ifodalaydi. Uning asosiy tarkibiy qismlaridan biri vaqt intervallarini ifodalash uchun maxsus mo'ljallangan Duration obyektidir. O'zgaruvchanlik va vaqt mintaqasi murakkabliklaridan aziyat chekadigan an'anaviy Date obyektidan farqli o'laroq, Duration vaqt oralig'i bilan ishlashning toza, aniqroq va xalqaro miqyosda moslashuvchan usulini taklif etadi. Ushbu to'liq qo'llanma Duration obyektini batafsil o'rganib chiqadi va asosiy qo'llanishdan tortib murakkab holatlargacha bo'lgan barcha jihatlarni qamrab oladi.
Temporal Duration nima?
Temporal.Duration ma'lum bir taqvim tizimi yoki vaqt mintaqasidan mustaqil bo'lgan vaqt oralig'ini ifodalaydi. U faqat yillar, oylar, kunlar, soatlar, daqiqalar, soniyalar va soniya ulushlarida ifodalangan vaqt miqdoriga e'tibor qaratadi. Buni "2023-yil 1-yanvardan 2028-yil 3-martgacha" emas, balki "5 yil, 3 oy va 2 kun" deb tasavvur qiling.
Bu farq juda muhim, chunki davomiyliklar tabiatan nisbiydir. Muayyan sanaga davomiylikni qo'shish har doim yangi sanani keltirib chiqaradi, ammo aniq natija taqvim tizimiga va boshlang'ich sanaga bog'liq. Masalan, 31-yanvarga bir oyni qo'shish, yil kabisa yili yoki yo'qligiga qarab turli sanalarga olib keladi.
Duration obyektlarini yaratish
Temporal.Duration obyektlarini yaratishning bir necha usullari mavjud:
1. Komponentlardan
Eng to'g'ridan-to'g'ri usul - bu Temporal.Duration.from metodini kerakli komponentlarni o'z ichiga olgan obyekt bilan ishlatish:
const duration1 = Temporal.Duration.from({ years: 1, months: 6, days: 15 });
console.log(duration1.toString()); // Chiqish: P1Y6M15D
const duration2 = Temporal.Duration.from({ hours: 8, minutes: 30, seconds: 12, milliseconds: 500 });
console.log(duration2.toString()); // Chiqish: PT8H30M12.5S
const duration3 = Temporal.Duration.from({ years: 2, days: -5, seconds: 30 });
console.log(duration3.toString()); // Chiqish: P2YT-5S30S
E'tibor bering, vaqt bo'yicha orqaga harakatlanadigan davomiylikni ifodalash uchun manfiy qiymatlardan foydalanishingiz mumkin.
2. ISO 8601 qatoridan
Temporal.Duration.from metodi ISO 8601 davomiylik qatorini ham qabul qiladi:
const duration4 = Temporal.Duration.from('P3Y2M10DT5H30M');
console.log(duration4.toString()); // Chiqish: P3Y2M10DT5H30M
const duration5 = Temporal.Duration.from('PT1H15M30S');
console.log(duration5.toString()); // Chiqish: PT1H15M30S
const duration6 = Temporal.Duration.from('P-1Y');
console.log(duration6.toString()); // Chiqish: P-1Y
ISO 8601 davomiylik formati P[yillar]Y[oylar]M[kunlar]D[T[soatlar]H[daqiqalar]M[soniyalar]S]. 'P' davrni (davomiylikni) bildiradi, 'T' esa sana va vaqt komponentlarini ajratadi.
3. Konstruktordan foydalanish
Siz to'g'ridan-to'g'ri Temporal.Duration konstruktoridan ham foydalanishingiz mumkin:
const duration7 = new Temporal.Duration(1, 2, 3, 4, 5, 6, 7, 8);
console.log(duration7.toString()); // Chiqish: P1Y2M3W4DT5H6M7S8ms
Konstruktor argumentlari quyidagi tartibda: yillar, oylar, haftalar, kunlar, soatlar, daqiqalar, soniyalar, millisoniyalar, mikrosoniyalar, nanosoniyalar.
Duration xususiyatlari
Duration obyektini yaratganingizdan so'ng, uning komponentlariga xususiyatlari orqali kirishingiz mumkin:
const duration = Temporal.Duration.from('P1Y2M3DT4H5M6S');
console.log(duration.years); // Chiqish: 1
console.log(duration.months); // Chiqish: 2
console.log(duration.days); // Chiqish: 3
console.log(duration.hours); // Chiqish: 4
console.log(duration.minutes); // Chiqish: 5
console.log(duration.seconds); // Chiqish: 6
console.log(duration.milliseconds); // Chiqish: 0
console.log(duration.microseconds); // Chiqish: 0
console.log(duration.nanoseconds); // Chiqish: 0
Duration arifmetikasi
Duration obyekti arifmetik amallarni bajarish uchun metodlarni taqdim etadi:
1. Davomiyliklarni qo'shish
Ikki davomiylikni bir-biriga qo'shish uchun add metodidan foydalaning:
const duration1 = Temporal.Duration.from('P1Y2M');
const duration2 = Temporal.Duration.from('P3M4D');
const sum = duration1.add(duration2);
console.log(sum.toString()); // Chiqish: P1Y5M4D
2. Davomiyliklarni ayirish
Bir davomiylikdan boshqasini ayirish uchun subtract metodidan foydalaning:
const duration1 = Temporal.Duration.from('P1Y2M');
const duration2 = Temporal.Duration.from('P3M4D');
const difference = duration1.subtract(duration2);
console.log(difference.toString()); // Chiqish: PPT11M-4D
3. Davomiylikni manfiy qilish
Davomiylikdagi barcha komponentlarning ishorasini o'zgartirish uchun negated metodidan foydalaning:
const duration = Temporal.Duration.from('P1Y2M-3D');
const negatedDuration = duration.negated();
console.log(negatedDuration.toString()); // Chiqish: P-1YT-2M3D
4. Davomiylikning mutlaq qiymati
Barcha komponentlari musbat bo'lgan davomiylikni olish uchun abs metodidan foydalaning:
const duration = Temporal.Duration.from('P-1YT2M-3D');
const absoluteDuration = duration.abs();
console.log(absoluteDuration.toString()); // Chiqish: P1YT2M3D
5. Davomiylikni ko'paytirish
Davomiylikni biror songa ko'paytirish uchun multiply metodidan foydalaning:
const duration = Temporal.Duration.from('PT1H30M');
const multipliedDuration = duration.multiply(2.5);
console.log(multipliedDuration.toString()); // Chiqish: PT3H45M
6. Davomiylikni yaxlitlash
Davomiylikni ma'lum bir birlikka yaxlitlash uchun round metodidan foydalaning. Bu relativeTo opsiyasini taqdim etishni talab qiladi, u Temporal.PlainDateTime yoki Temporal.ZonedDateTime bo'lishi mumkin, chunki ba'zi birliklar (oylar va yillar kabi) o'zgaruvchan uzunlikka ega.
const duration = Temporal.Duration.from('P1DT12H30M');
const relativeTo = Temporal.PlainDateTime.from('2024-01-01T00:00:00');
const roundedDuration = duration.round({ smallestUnit: 'days', relativeTo });
console.log(roundedDuration.toString()); // Chiqish: P2D
Bu misolda 1 kun va 12 soat 2 kunga yaxlitlangan.
Davomiyliklarni taqqoslash
Ikki davomiylikni compare metodi yordamida taqqoslashingiz mumkin. Biroq, aralash birliklarga ega (masalan, yillar va kunlar) davomiyliklarni nisbiy kontekst (muayyan sana va taqvim) bo'lmasdan ishonchli taqqoslab bo'lmasligini yodda tuting. compare funksiyasi quyidagilarni qaytaradi:
- -1 agar duration1 duration2 dan kichik bo'lsa
- 0 agar duration1 duration2 ga teng bo'lsa
- 1 agar duration1 duration2 dan katta bo'lsa
const duration1 = Temporal.Duration.from('PT1H');
const duration2 = Temporal.Duration.from('PT30M');
console.log(Temporal.Duration.compare(duration1, duration2)); // Chiqish: 1
console.log(Temporal.Duration.compare(duration2, duration1)); // Chiqish: -1
console.log(Temporal.Duration.compare(duration1, Temporal.Duration.from('PT1H'))); // Chiqish: 0
const duration3 = Temporal.Duration.from('P1M');
const duration4 = Temporal.Duration.from('P30D');
// duration3 va duration4 ni to'g'ridan-to'g'ri taqqoslash ko'plab dvigatellarda xatolik beradi
// agar 'relativeTo' ko'rsatilmagan bo'lsa, chunki oyning uzunligi doimiy emas.
Amaliy misollar va qo'llash holatlari
Temporal.Duration obyekti nihoyatda ko'p qirrali bo'lib, keng ko'lamli ilovalarda qo'llanilishi mumkin:
1. Loyiha davomiyligini hisoblash
Tasavvur qiling, siz boshlanish va tugash sanasi bo'lgan loyihani boshqaryapsiz. Loyihaning davomiyligini hisoblash uchun Temporal.PlainDate va Temporal.Duration dan foydalanishingiz mumkin:
const startDate = Temporal.PlainDate.from('2024-01-15');
const endDate = Temporal.PlainDate.from('2024-03-20');
const duration = endDate.since(startDate);
console.log(duration.toString()); // Chiqish: P1M5D
2. Takrorlanuvchi hodisalarni rejalashtirish
Haftalik yig'ilishlar yoki oylik hisobotlar kabi takrorlanuvchi hodisalarning chastotasini aniqlash uchun Temporal.Duration dan foydalanishingiz mumkin:
const eventFrequency = Temporal.Duration.from({ weeks: 1 });
let nextEventDate = Temporal.PlainDate.from('2024-01-22');
for (let i = 0; i < 5; i++) {
console.log(`Hodisa ${i + 1}: ${nextEventDate.toString()}`);
nextEventDate = nextEventDate.add(eventFrequency);
}
// Chiqish:
// Hodisa 1: 2024-01-22
// Hodisa 2: 2024-01-29
// Hodisa 3: 2024-02-05
// Hodisa 4: 2024-02-12
// Hodisa 5: 2024-02-19
3. Yoshni hisoblash
Yoshni aniq hisoblash kabisa yillari va turli taqvim tizimlarini hisobga olishni talab qilsa-da, Temporal.Duration yaxshi taxminiy natijani berishi mumkin:
const birthDate = Temporal.PlainDate.from('1990-05-10');
const today = Temporal.PlainDate.from('2024-02-15');
const ageDuration = today.since(birthDate);
console.log(`Taxminiy yosh: ${ageDuration.years} yil, ${ageDuration.months} oy, ${ageDuration.days} kun`);
4. Vaqt mintaqasini hisobga olgan holda hisob-kitoblar: Parvoz davomiyligi
Global ilovalar uchun vaqt mintaqalarini boshqarish juda muhim. Turli vaqt mintaqalari orasidagi parvoz davomiyligini hisoblashni ko'rib chiqing:
const departureZonedDateTime = Temporal.ZonedDateTime.from('2024-03-15T10:00:00[America/Los_Angeles]');
const arrivalZonedDateTime = Temporal.ZonedDateTime.from('2024-03-16T14:30:00[Europe/London]');
const flightDuration = arrivalZonedDateTime.since(departureZonedDateTime);
console.log(`Parvoz davomiyligi: ${flightDuration.hours} soat, ${flightDuration.minutes} daqiqa`);
console.log(flightDuration.toString());
Bu misol Temporal.ZonedDateTime .since() bilan birlashganda vaqt mintaqasi farqlarini avtomatik ravishda qanday sozlashini va parvozning aniq davomiyligini taqdim etishini ko'rsatadi.
5. Xizmat ko'rsatish darajasi kelishuvlarini (SLA) kuzatish
Ko'pgina onlayn xizmatlar uzluksiz ishlash kafolatlarini va'da qiladi. Siz ushbu kelishuvlarni belgilash va kuzatish uchun `Temporal.Duration` dan foydalanishingiz mumkin.
const slaGuarantee = Temporal.Duration.from('PT99H59M59S'); // Deyarli 100 soat
const downtime = Temporal.Duration.from('PT1H');
if (downtime.compare(slaGuarantee) > 0) {
console.log("SLA buzildi!");
} else {
console.log("SLA bajarildi.");
}
Murakkab jihatlar
1. Oylar va yillarning noaniqligi
Yuqorida aytib o'tilganidek, oylar va yillarning uzunligi o'zgarishi mumkin. Ushbu birliklar bilan hisob-kitoblarni amalga oshirayotganda, ko'pincha Temporal.PlainDateTime yoki Temporal.ZonedDateTime yordamida nisbiy kontekstni taqdim etish kerak bo'ladi. Bu, ayniqsa, davomiyliklarni yaxlitlash yoki taqqoslashda muhimdir.
2. Taqvim tizimlari
Temporal API turli xil taqvim tizimlarini qo'llab-quvvatlaydi. Odatiy bo'lib, u eng keng tarqalgan ISO 8601 taqvimidan foydalanadi. Biroq, siz Temporal.PlainDate yoki Temporal.ZonedDateTime obyektlarini yaratishda boshqa taqvim tizimlarini belgilashingiz mumkin. Davomiyliklar taqvimdan mustaqil bo'lib qoladi; ular vaqt miqdorini ifodalaydi.
3. Vaqt mintaqasi ma'lumotlar bazasi yangilanishlari
Vaqt mintaqasi qoidalari siyosiy yoki geografik sabablarga ko'ra vaqt o'tishi bilan o'zgarishi mumkin. Aniq hisob-kitoblarni ta'minlash uchun, ayniqsa Temporal.ZonedDateTime bilan ishlaganda, vaqt mintaqasi ma'lumotlar bazasini yangilab turish juda muhimdir. Zamonaviy JavaScript ishga tushirish muhitlari odatda buni avtomatik ravishda boshqaradi, ammo ba'zi muhitlarda ma'lumotlar bazasini qo'lda yangilashingiz kerak bo'lishi mumkin.
Eng yaxshi amaliyotlar
- Ketma-ketlashtirish va ma'lumotlar almashinuvi uchun ISO 8601 davomiylik qatorlaridan foydalaning. Bu o'zaro muvofiqlikni ta'minlaydi va noaniqlikning oldini oladi.
- Vaqt intervallarini ifodalash uchun ikkita
Dateobyekti orasidagi farqni to'g'ridan-to'g'ri hisoblash o'rnigaTemporal.Durationdan foydalanishni afzal ko'ring. Bu toza va qo'llab-quvvatlanishi osonroq kodga olib keladi. - Oylar va yillarning noaniqligini yodda tuting va kerak bo'lganda har doim nisbiy kontekstni taqdim eting.
- Vaqt mintaqasini hisobga oladigan hisob-kitoblar uchun
Temporal.ZonedDateTimedan foydalaning. - Vaqt mintaqasi ma'lumotlar bazasini yangilab turing.
- Aralash birliklarga ega davomiyliklarni taqqoslaganda, aniq taqqoslashni ta'minlash uchun har doim nisbiy kontekst bilan
rounddan foydalaning.
Xulosa
Temporal.Duration obyekti JavaScript'da vaqt intervallari bilan ishlashning kuchli va intuitiv usulini taqdim etadi. Uning xususiyatlari, metodlari va eng yaxshi amaliyotlarini tushunish orqali siz yanada mustahkam, aniq va xalqaro miqyosda moslashuvchan kod yozishingiz mumkin. Temporal API va xususan Duration obyekti JavaScript'ning sanalar va vaqtlar bilan ishlashida sezilarli qadam bo'lib, ham aniq, ham global miqyosda dolzarb bo'lgan ilovalarni yaratishni osonlashtiradi. Temporal API'ni qabul qiling va vaqt bilan bog'liq hisob-kitoblaringizni soddalashtirish uchun uning imkoniyatlaridan foydalaning.
Temporal API rivojlanishda davom etar ekan, yangi xususiyatlar va yangilanishlar haqida xabardor bo'lib turing. Rasmiy ECMAScript taklifi va tegishli hujjatlar yangiliklardan xabardor bo'lish uchun ajoyib manbalardir.